/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.evangelion.core.daoImpl;

import com.evangelion.core.bean.Factura;
import com.evangelion.core.bean.Seccione;
import com.evangelion.core.dao.FacturaDao;
import com.evangelion.core.pojo.IvaSum;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.Query;
import java.util.*;

/**
 * @author Kellycasma
 */
@Component
@Transactional
public class FacturaDaoImpl extends AbstractDAO implements FacturaDao {

    @Override
    public List<Factura> searchByMatricula(Seccione seccion, String valorParametro, Date fechaI, Date fechaF) {
        Query q = em.createQuery("SELECT f FROM Factura f WHERE f.vehiculo.matricula LIKE :valorParametro AND f.fecha>= :fechaI AND  f.fecha<=:fechaF AND f.seccion=:seccion");

        q.setParameter("valorParametro", "%" + valorParametro + "%");
        q.setParameter("fechaI", fechaI);
        q.setParameter("fechaF", fechaF);
        q.setParameter("seccion", seccion);

        return q.getResultList();
    }

    @Override
    public void save(Factura factura) {
        super.save(factura);
    }

    @Override
    public Factura findObjByParam(String parametro, String valor) {
        return (Factura) findObjByParam(Factura.class, parametro, valor);
    }

    public Object[] ivaEgresos(Date fechadesde, Date fechahasta, String tipo) {
        Object[] obj = new Object[4];
        Query q = null;
        if (tipo.equals("Diario 1")) {
            q = em.createNativeQuery("SELECT sum(haber), iva from movimientos where fecha>=? AND fecha<=? GROUP BY iva ");
        }
        if (tipo.equals("Diario 2")) {
            q = em.createNativeQuery("SELECT sum(haber-descuento_declaracion), iva from movimientos_aux where fecha>=? AND fecha<=? GROUP BY iva ");
        }

        q.setParameter(1, fechadesde);
        q.setParameter(2, fechahasta);
        List<Object[]> resultado = q.getResultList();
        System.out.println("resultado.size():" + resultado.size());
        obj[0] = 0.0;
        obj[1] = 0.0;
        obj[2] = 0.0;
        obj[3] = 0.0;
        for (int i = 0; i < resultado.size(); i++) {
            System.out.println("resultado.get(" + i + ")[1]" + resultado.get(i)[1] + " -> " + resultado.get(i)[0]);
            if (((Double) resultado.get(i)[1]) == 0) {
                obj[0] = 0.0;
                if (resultado.get(i)[0] != null)
                    obj[0] = resultado.get(i)[0];
            }
            if (((Double) resultado.get(i)[1]) == 4) {
                obj[1] = 0.0;
                if (resultado.get(i)[0] != null)
                    obj[1] = resultado.get(i)[0];
            }
            if (((Double) resultado.get(i)[1]) == 10) {
                obj[2] = 0.0;
                if (resultado.get(i)[0] != null)
                    obj[2] = resultado.get(i)[0];
            }
            if (((Double) resultado.get(i)[1]) == 21) {
                obj[3] = 0.0;
                if (resultado.get(i)[0] != null)
                    obj[3] = resultado.get(i)[0];
            }
        }
        return obj;
    }

    public List<IvaSum> ivaIngresos(Date fechadesde, Date fechahasta, Seccione seccion) {
        String sql = "SELECT m.iva, SUM(m.haber), SUM(m.debe) from Movimiento m WHERE ( m.iva = 0 or m.iva = 4 or m.iva = 10 or m.iva = 21) ";
        Map<String, Object> pMap = new HashMap<String, Object>();
        if (null != fechadesde) {
            sql += " AND m.fecha>=:fechadesde";
            pMap.put("fechadesde", fechadesde);
        }
        if (null != seccion) {
            sql += " AND m.seccion=:seccion";
            pMap.put("seccion", seccion);
        }

        if (null != fechahasta) {
            sql += " AND m.fecha<=:fechahasta ";
            pMap.put("fechahasta", fechahasta);
        }

        sql += "  GROUP BY m.iva ORDER BY m.iva";

        Query query = em.createQuery(sql);

        applyParams(query, pMap);
        List<Object[]> results = query.getResultList();

        List<IvaSum> isList = new ArrayList<IvaSum>();

        for (Object[] obj : results) {
            IvaSum ivasum = new IvaSum();
            ivasum.setIva((Double) obj[0]);
            ivasum.setHaberSum((Double) obj[1]);
            ivasum.setDebeSum((Double) obj[2]);
            isList.add(ivasum);
        }

        return isList;
    }

    public int getIdFactura() {
        String sql = "SELECT max(f.id) from Factura f";
        Query q = em.createQuery(sql);
        try {
            return Integer.parseInt("" + q.getSingleResult());
        } catch (Exception e) {
            return 1;
        }
    }
}